/**
 * @用途 DraggableItem 组件类型定义
 * @author AI Assistant
 * @创建时间 2025-11-17
 **/

import type { Input } from '@atlaskit/pragmatic-drag-and-drop/dist/types/internal-types'
import type { Edge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge'
import type { DragData, DragType } from '@/composables/dragAndDrop/dragDropUtil'
import type { TabDragState } from '@/composables/dragAndDrop/useDragHandle'
import type { TabDropState } from '@/composables/dragAndDrop/useDropHandle'

/**
 * DraggableItem 组件 Props 定义
 */
export interface DraggableItemProps<T extends DragType> {
  /** 拖拽数据类型标识 */
  dragType: T

  /** 拖拽时携带的数据，可以是静态对象或动态函数 */
  dragData: DragData[T] | (() => DragData[T])

  /** 接受的拖拽类型数组，如果不提供则不启用放置功能 */
  acceptedTypes?: DragType[]

  /** 允许的边缘位置，用于确定放置位置 */
  allowedEdges?: Edge[]

  /** 禁用拖拽功能 */
  noDrag?: boolean

  /** 启用原生跨窗口拖拽 */
  nativeDrag?: boolean

  /** 拖拽预览的偏移量配置 */
  previewOffset?: { x: string; y: string }

  /** 是否显示拖拽指示器 */
  showDropIndicator?: boolean

  /** 拖拽指示器颜色 */
  dropIndicatorColor?: string

  /** 拖拽指示器偏移量 */
  dropIndicatorOffset?: string

  /** 拖拽时应用的 CSS 类名 */
  dragClass?: string

  /** 放置目标悬停时应用的 CSS 类名 */
  dropClass?: string

  /** 自定义放置验证函数 */
  canDrop?: (source: any, input: Input, isExternal?: boolean) => boolean
}

/**
 * DraggableItem 组件 Emits 定义
 */
export interface DraggableItemEmits<T extends DragType> {
  /** 拖拽开始事件 */
  'drag-start': []

  /** 拖拽结束事件 */
  'drag-end': []

  /** 放置事件 */
  drop: [data: Pick<DragData, T>, edge: Edge | null, isExternal?: boolean]

  /** 拖拽进入目标区域事件 */
  'drag-enter': []

  /** 拖拽离开目标区域事件 */
  'drag-leave': []
}

/**
 * DraggableItem 组件默认插槽作用域数据
 */
export interface DraggableItemSlotProps {
  /** 拖拽状态 */
  dragState: TabDragState

  /** 放置状态 */
  dropState: TabDropState

  /** 是否正在拖拽 */
  isDragging: boolean

  /** 是否为放置目标 */
  isDropTarget: boolean

  /** 最近的边缘位置 */
  closestEdge: Edge | null
}

/**
 * DraggableItem 组件预览插槽作用域数据
 */
export interface DraggableItemPreviewSlotProps<T extends DragType> {
  /** 拖拽数据 */
  dragData: DragData[T]

  /** 预览容器元素 */
  container: HTMLElement
}
